/**
 * axios封装
 * 请求拦截、响应拦截、错误统一处理
 */
import axios from 'axios';
import store from '../store/store';
import router from '../router/router';
import { colorLog } from '../common/Tool';
import GLOBAL from '../env';


var loading = null;
// 创建axios实例
var instance = axios.create({
    baseURL: GLOBAL.authUrl,
    // baseURL: process.env.NODE_ENV === 'development'?GLOBAL.authUrl:'https://www.xxxxx.com/api',
    timeout: 6000,
    headers: {
		'Content-Type': "application/json;charset=UTF-8"
	},
});

/** 
 * 请求拦截器 
 * 每次请求前，如果存在token则在请求头中携带token 
 */
instance.interceptors.request.use(
    config => {
        // loading = ElLoading.service({
        //     text: '请稍后',
        //     background: 'rgba(0, 0, 0, 0.7)',
        // })
        // header增加对应的token  
        const token = store.getters.token;  
        if(token) config.headers.Authorization = token;
        console.time()
        // colorLog("", '------------------------------------------------------------', "log");
        // colorLog("请求头:", config.headers, "info");
        // colorLog("请求参数:", config.data, "info");
        // colorLog(`${config.method}请求地址：`, config.url, "info");
        return config;
    },
    error => Promise.error(error))


// 响应拦截器
instance.interceptors.response.use(
    // 请求成功
    res => {
        console.timeEnd()
        console.log(res.data);
        // loading.close();
        if (res.data.code === 200) {
            colorLog("响应成功", res.data, "log");
            return Promise.resolve(res.data)
        } else {
            colorLog("code异常", res.data, "error");
            let msg =res.data.message
            if(msg)  ElMessage.error(msg);
            errorHandle(res.data.code);
            return Promise.reject(res.data)
        }
    },
    // 请求失败
    error => {
        console.timeEnd()
        colorLog("请求失败", error, "error");
        // loading.close();
        if (error) {
            errorHandle(error.status.response);
            return Promise.reject(error);
        } else {
            // 处理断网的情况
            // eg:请求超时或断网时，更新state的network状态
            // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
            // 关于断网组件中的刷新重新获取数据，会在断网组件中说明
            if (!window.navigator.onLine) {
                // store.commit('changeNetwork', false);
            } else {
                return Promise.reject(error);
            }
        }
    });

/** 
* 请求失败后的错误统一处理 
* @param {Number} status 请求失败的状态码
*/
const errorHandle = (status, other) => {
    console.log(status);
    // 状态码判断
    switch (status) {
        // 401: 未登录状态，跳转登录页
        case 401:
            store.dispatch('SET_ACCESS_TOKEN', '')
            break;
        case 403:
            break;
        // 404请求不存在
        case 404:
            ElMessage.error('请求的资源不存在')
            break;
        case 500:
            ElMessage.error('服务器响应错误')
            break;
    }
}

const request = {
    post(url, data) {
        return new Promise((resolve, reject) => {
            instance.post(url, data || {}).then(res => {
                if (res) resolve(res);
            }).catch(err => {
                if (err) reject(err);
            })
        });
    },
    get(url, params) {
        console.log(params);
        return new Promise((resolve, reject) => {
            instance.get(url, {
                params: params,
            }).then(res => {
                if (res) resolve(res);
            }).catch(err => {
                if (err) reject(err);
            })
        });
    },
    uploadFile(url, file) {        
        return new Promise((resolve, reject) => {
            let formData = new FormData()
		    formData.append('file', file.raw)
            instance.post(url, formData).then(res => {
                if (res) resolve(res);
            }).catch(err => {
                if (err) reject(err);
            })
        });
    }
}
export default request